package com.ruoyi.common.utils;

import com.ruoyi.common.core.domain.entity.SysUser;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

public class YonbipFileUtils
{
    /**
     * 创建目录（如果不存在）
     * @param directoryPath 目录路径
     * @return 创建成功返回true，否则返回false
     */
    public static boolean createDirectoryIfNotExists(String directoryPath) {
        File directory = new File(directoryPath);
        if (!directory.exists()) {
            boolean created = directory.mkdirs();
            if (created) {
                System.out.println("目录创建成功: " + directoryPath);
                return true;
            } else {
                System.out.println("目录创建失败: " + directoryPath);
                return false;
            }
        }
        return true;
    }

    /**
     * 通用方法：创建文件并写入内容
     * @param directoryPath 目录路径
     * @param fileName 文件名
     * @param content 要写入的内容（字符串）
     * @param append 是否追加模式
     * @return 创建成功返回true，否则返回false
     */
    public static boolean createFileWithContent(String directoryPath, String fileName,
                                                String content, boolean append) {
        if (!createDirectoryIfNotExists(directoryPath)) {
            return false;
        }

        File file = new File(directoryPath, fileName);
        try (BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(new FileOutputStream(file, append), StandardCharsets.UTF_8))) {

            writer.write(content);
            System.out.println("文件创建并写入成功: " + file.getAbsolutePath());
            return true;

        } catch (IOException e) {
            System.err.println("文件操作出错: " + e.getMessage());
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 创建文件并写入多行内容
     * @param directoryPath 目录路径
     * @param fileName 文件名
     * @param lines 多行内容列表
     * @param append 是否追加模式
     * @return 创建成功返回true，否则返回false
     */
    public static boolean createFileWithLines(String directoryPath, String fileName,
                                              List<String> lines, boolean append) {
        if (!createDirectoryIfNotExists(directoryPath)) {
            return false;
        }

        File file = new File(directoryPath, fileName);
        try (BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(new FileOutputStream(file, append), StandardCharsets.UTF_8))) {

            for (String line : lines) {
                writer.write(line);
                writer.newLine();
            }

            System.out.println("文件创建并写入成功: " + file.getAbsolutePath());
            return true;

        } catch (IOException e) {
            System.err.println("文件操作出错: " + e.getMessage());
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 创建文件并写入格式化内容（类似原代码功能）
     * @param directoryPath 目录路径
     * @param fileName 文件名
     * @param lineCount 行数
     * @param linePattern 行内容模式（可使用%d作为行号占位符）
     * @return 创建成功返回true，否则返回false
     */
    public static boolean createFormattedFile(String directoryPath, String fileName,
                                              int lineCount, String linePattern) {
        if (!createDirectoryIfNotExists(directoryPath)) {
            return false;
        }

        File file = new File(directoryPath, fileName);
        try (BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8))) {

            for (int i = 0; i < lineCount; i++) {
                String content = linePattern.replace("%d", String.valueOf(i));
                writer.write(content);
                writer.newLine();
            }

            System.out.println("文件创建并写入成功: " + file.getAbsolutePath());
            return true;

        } catch (IOException e) {
            System.err.println("文件操作出错: " + e.getMessage());
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 简化方法：创建文件并写入内容（覆盖模式）
     * @param filePath 完整文件路径（包含文件名）
     * @param content 要写入的内容
     * @return 创建成功返回true，否则返回false
     */
    public static boolean writeToFile(String filePath, String content) {
        File file = new File(filePath);
        File parentDir = file.getParentFile();

        if (parentDir != null && !parentDir.exists() && !parentDir.mkdirs()) {
            System.err.println("目录创建失败: " + parentDir.getAbsolutePath());
            return false;
        }

        try (BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8))) {

            writer.write(content);
            System.out.println("文件写入成功: " + file.getAbsolutePath());
            return true;

        } catch (IOException e) {
            System.err.println("文件操作出错: " + e.getMessage());
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 检查文件是否存在
     * @param filePath 文件路径
     * @return 文件存在返回true，否则返回false
     */
    public static boolean fileExists(String filePath) {
        return new File(filePath).exists();
    }

    /**
     * 删除文件
     * @param filePath 文件路径
     * @return 删除成功返回true，否则返回false
     */
    public static boolean deleteFile(String filePath) {
        File file = new File(filePath);
        if (file.exists()) {
            boolean deleted = file.delete();
            if (deleted) {
                System.out.println("文件删除成功: " + filePath);
            } else {
                System.out.println("文件删除失败: " + filePath);
            }
            return deleted;
        }
        return true; // 文件不存在也算删除成功
    }

   // List<SysUser> list = userService.selectUserList(user);
   // List<String> lines=new ArrayList<>();
   //       for(SysUser user1 :list ){
//
   // lines.add(user1.getLoginName()+"|"+user1.getLoginName()+"|"+user1.getUserId()+"|"+user1.getUserType());}
//
   // boolean success3 = YonbipFileUtils.createFileWithLines(
   //         "C:/example_directory",
   //         "multi_line.txt",
   //         lines,
   //         false
   // );
   //     System.out.println(success3);
}
